home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / conhlp03 / fswchsrc / lookfile.c < prev    next >
C/C++ Source or Header  |  1995-02-20  |  3KB  |  127 lines

  1. /*
  2.     lookfile.c
  3.     1994/03/04 1994/03/08 1995/02/20
  4. */
  5.  
  6. #include <stdlib.h>
  7. #include "fswch.h"
  8.  
  9. int instr( char a, const char *); /* 文字列sの文字aの位置 */
  10. int split( char *s, char **str, const char *sep); /* 文字の切り分け */
  11. int strcmp( const char *,const char *); /* 文字列の比較 */
  12. char *strcpy( char *,const char *); /* 文字列のコピー */
  13. char *strcat( char *a,const char *b); /* 文字列の連結 */
  14. char *koumoku( char *k ); /* 項目とりだし */
  15. void filetype( FILE *fp ); /* ファイル表示 */
  16.  
  17.  
  18. void lookfile( char cm,int no ){
  19.  
  20.     static char buff[256],filename[85],pname[85];
  21.     char *bp,*str[10];
  22.     struct find_t fname;
  23.     fpos_t ptr;
  24.     FILE *fp;
  25.  
  26.     /* キー選択チェック */
  27.     if(no<0) return;
  28.  
  29.     ptr = idxptr[no];
  30.     fsetpos(idxfp,&(ptr));
  31.     /* DIR を得る */
  32.     do{
  33.         fgets(buff,256,idxfp);
  34.         if((bp=koumoku(buff))==NULL){
  35.             fputs("項目エラー\r\n",stderr);
  36.             return;
  37.         }
  38.         if(cm=='g' && strcmp(buff,"README")==0) break;
  39.         if(cm=='d' && strcmp(buff,"MANUAL")==0) break;
  40.         if(strcmp(buff,"DIR")==0) break;
  41.     }while(buff[0]>='A' && buff[0]<='Z');
  42.     cprintf("\r\n\nno:%3d %s %s\r\n",no,buff,bp);
  43.  
  44.     strcpy(pname,"q:");
  45.     if(strcmp(buff,"MANUAL")==0 || strcmp(buff,"README")==0){
  46.         strcpy(filename,pname);
  47.         strcat(filename,bp);
  48.     } else {
  49.         int sc;
  50.         strcat(pname,bp);
  51.         strcat(pname,"\\"); /* ディレクトリパス */
  52.         sc = split(bp,str,"\\"); /* \ で 分割 */
  53.         strcpy(filename,pname);
  54.         strcat(filename,str[sc-1]); /* ディレクトリ名をファイル名に */
  55.         if(cm=='g') strcat(filename,".ggg");
  56.         if(cm=='d') strcat(filename,".doc");
  57.     }
  58.     if((fp=fopen(filename,"r"))==NULL){
  59.         strcpy(filename,pname);
  60.         if(cm=='g')strcat(filename,"*.ggg");
  61.         if(cm=='d')strcat(filename,"*.doc");
  62.         _dos_findfirst(filename,_A_NORMAL,&fname); /* 通常ファイル */
  63.         strcpy(filename,pname);
  64.         strcat(filename,fname.name);
  65.     }
  66.     cprintf(ESC"0J"ESC_GREEN"file = %s\r\n"ESC_WHITE,filename);
  67.     /*
  68.     cputs(ESC_YELLOW"--- Hit anykey. ---");
  69.     getop();
  70.     cputs(ESC"2K\r"ESC_WHITE);
  71.     */
  72.     if(fp==NULL) if((fp=fopen(filename,"r"))==NULL) return;
  73.     /*
  74.         1. README or MANUAL 
  75.         2. DIR
  76.         3. *.doc *.ggg
  77.     */
  78.     if(pg==NULL){
  79.         filetype(fp);
  80.         fclose(fp);
  81.     }else{
  82.         fclose(fp);
  83.         strcpy(buff,pg);
  84.         strcat(buff," ");
  85.         strcat(buff,filename);
  86.         curon;
  87.         system( buff );
  88.         curoff;
  89.         /*
  90.         spawnlp(P_WAIT,pg,pg,filename,NULL);
  91.         */
  92.     }
  93. }
  94.  
  95.  
  96. void filetype( FILE *fp ){ /* ファイル表示 */
  97.  
  98.     int i;
  99.     char c;
  100.     int lc=0;
  101.  
  102.     for(i=0;(c=fgetc(fp))!=EOF;i++){
  103.         if( c!='\n' && c!='\t' && c!=0x1b && c < 0x20 || c == 0x7f )
  104.             cputs(ESC_YELLOW"."ESC_WHITE);
  105.         else putch(c);
  106.         if(c=='\n'){
  107.             putch('\r');
  108.             i=0;
  109.             lc++;
  110.         }
  111.         if(i>78 && !(
  112.             /* 全角文字 一文字目 ? */
  113.             0x80<c && c<0xa0 || 0xdf< c && c < 0xf0
  114.             ) ){ i=0; lc++; }
  115.         if(i==0 && lc==20){
  116.             cputs(ESC_GREEN"--- more (esc,取消:quit) ---"
  117.                 ESC_WHITE);
  118.             if(instr(getop(),"\x1b\x11")) return;
  119.             cputs(ESC"2K\r");
  120.             lc=0;
  121.         }
  122.     }
  123.     cputs("\r\n"ESC_YELLOW"File End. Hit anykey."ESC_WHITE);
  124.     getop();
  125.     clstext();
  126. }
  127.